﻿using Common.Communications;
using Microsoft.AspNetCore.Mvc;
using OpticalComService.Services;
using RcsService.ParaModel;
using static System.Net.Mime.MediaTypeNames;

namespace OpticalComService.Controllers
{
    [ApiController]
    [Route("agv/[controller]/[action]")]
    public class agvCallBackServiceController : ControllerBase
    {
        private RcsCallBackService service;

        public agvCallBackServiceController()
        {
            service = new RcsCallBackService();
        }

        /// <summary>
        /// 任务执行通知 agvCallback
        /// AGV执行回调的方法，包含任务开始，走出储位，任务完成及任务取消。 
        ///任务取消通知需要取消任务单才会上报，取消子任务不会上报。其他动作通知是单个任务组或
        ///子任务相应动作完成后进行上报。注意：是否通知需要在任务模板配置。
        /// </summary>
        /// <param name="para"></param>
        /// <returns></returns>
        [HttpPost]
        public async Task<ResultPara> agvCallback(ExecuteResponsePara para)
        {
            ResultPara resultPara = new ResultPara();
            if (service is not null)
            {
                resultPara = await service.AgvCallbackProcess(para);
            }
            return resultPara;
        }
        /// <summary>
        /// 告警推送通知 
        /// 告警推送回调的方法，调度系统将导致AGV停止运行的严重告警推送给上层系统。推送频率：10秒一次
        /// 该接口在调度系统的应用注册-业务通知中配置，启用表示通知、禁用表示不通知，通知对象为
        /// 方法配置中勾选的应用，可选择最少一个、最多三个应用。
        /// </summary>
        /// <param name="para"></param>
        /// <returns></returns>
        [HttpPost]
        public async Task<ResultPara> warnCallback(WarnPara para)
        {
            ResultPara resultPara = new ResultPara();
            if (service is not null)
            {
                resultPara = await service.WarnCallbackProcess(para);
            }
            return resultPara;
        }

        /// <summary>
        /// 绑定解绑通知
        /// 可在执行绑定货架与储位,绑定货架与物料,绑定仓位与容器后通知上层。 
        /// 该接口在调度系统的应用注册-业务通知中配置，启用表示通知、禁用表示不通知，通知对象为
        /// 方法配置中勾选的应用，可选择最少一个、最多三个应用。 
        /// </summary>
        /// <param name="para"></param>
        /// <returns></returns>
        [HttpPost]
        public async Task<ResultDataPara> bindNotify(BindNotifyPara para)
        {
            ResultDataPara result = new ResultDataPara();
            if (service is not null)
            {
                result = await service.BindNotifyProcess(para);
            }
            return result;
        }
        /// <summary>
        /// 校验料箱是否可入库（CTU）
        /// 梳齿工作站入库场景使用，在料箱流进梳齿工作站前，向上层系统询问料箱是否可入库。 
        /// 若可以入库，上层返回成功，料箱即流进梳齿工作站；若不能入库，返回错误码，此种情况一
        /// 般是料箱有问题，料箱不流入梳齿工作站，需要人工处理该料箱。 
        /// 该接口仅是询问能否进入梳齿工作站，料箱的回库仓位通过3.2.4申请回库仓位（CTU）接口
        /// </summary>
        /// <param name="para"></param>
        /// <returns></returns>
        [HttpPost]
        public async Task<ResultPara> applyReturnForValid(ApplyReturnForValidPara para)
        {
            ResultPara result = new ResultPara();
            if (service is not null)
            {
                result = await service.ApplyReturnForValidProcess(para);
            }
            return result;
        }

        /// <summary>
        /// 申请回库仓位（CTU） 
        /// 梳齿工作站和输送线入库场景使用，向上层系统申请料箱的入库位置 
        /// 在B05、B06、B08任务模板中配置通知（申请回库仓位）与第三方的对接路径 
        /// 返回数据需按照接口说明中的字段格式返回
        /// </summary>
        /// <param name="para"></param>
        /// <returns></returns>
        [HttpPost]
        public async Task<ApplyReturnForBinResultPara> applyReturnForBin(ApplyReturnForBinPara para)
        {
            ApplyReturnForBinResultPara result = new ApplyReturnForBinResultPara();
            if (service is not null)
            {
                result = await service.ApplyReturnForBinProcess(para);
            }
            return result;
        }
    }
}
